From 1e66efe5169dfad9a0c62ba42fbf31ce977bf49e Mon Sep 17 00:00:00 2001 From: Sebastien Castiel Date: Tue, 19 Dec 2023 09:36:40 -0500 Subject: Use modal dialogs for expense creation & edition (#10) * First attemps at using route interception and modals * Remove route interception * Make it work * Use Vaul on small screens * Improve vaul --- .../[groupId]/expenses/[expenseId]/edit/page.tsx | 42 ---------------------- src/app/groups/[groupId]/expenses/actions.ts | 28 +++++++++++++++ src/app/groups/[groupId]/expenses/create/page.tsx | 27 -------------- src/app/groups/[groupId]/expenses/expense-list.tsx | 9 +++-- src/app/groups/[groupId]/expenses/expense-page.tsx | 19 ++++++++++ src/app/groups/[groupId]/expenses/layout.tsx | 9 +++++ src/app/groups/[groupId]/expenses/page.tsx | 2 +- 7 files changed, 64 insertions(+), 72 deletions(-) delete mode 100644 src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx create mode 100644 src/app/groups/[groupId]/expenses/actions.ts delete mode 100644 src/app/groups/[groupId]/expenses/create/page.tsx create mode 100644 src/app/groups/[groupId]/expenses/expense-page.tsx create mode 100644 src/app/groups/[groupId]/expenses/layout.tsx (limited to 'src/app/groups/[groupId]/expenses') diff --git a/src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx b/src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx deleted file mode 100644 index 188d08f..0000000 --- a/src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { ExpenseForm } from '@/components/expense-form' -import { deleteExpense, getExpense, getGroup, updateExpense } from '@/lib/api' -import { expenseFormSchema } from '@/lib/schemas' -import { Metadata } from 'next' -import { notFound, redirect } from 'next/navigation' - -export const metadata: Metadata = { - title: 'Edit expense', -} - -export default async function EditExpensePage({ - params: { groupId, expenseId }, -}: { - params: { groupId: string; expenseId: string } -}) { - const group = await getGroup(groupId) - if (!group) notFound() - const expense = await getExpense(groupId, expenseId) - if (!expense) notFound() - - async function updateExpenseAction(values: unknown) { - 'use server' - const expenseFormValues = expenseFormSchema.parse(values) - await updateExpense(groupId, expenseId, expenseFormValues) - redirect(`/groups/${groupId}`) - } - - async function deleteExpenseAction() { - 'use server' - await deleteExpense(expenseId) - redirect(`/groups/${groupId}`) - } - - return ( - - ) -} diff --git a/src/app/groups/[groupId]/expenses/actions.ts b/src/app/groups/[groupId]/expenses/actions.ts new file mode 100644 index 0000000..31bb2e7 --- /dev/null +++ b/src/app/groups/[groupId]/expenses/actions.ts @@ -0,0 +1,28 @@ +'use server' +import { createExpense, deleteExpense, updateExpense } from '@/lib/api' +import { expenseFormSchema } from '@/lib/schemas' +import { revalidatePath } from 'next/cache' + +export async function createExpenseAction(groupId: string, values: unknown) { + 'use server' + const expenseFormValues = expenseFormSchema.parse(values) + await createExpense(expenseFormValues, groupId) + revalidatePath(`/groups/${groupId}`, 'layout') +} + +export async function updateExpenseAction( + groupId: string, + expenseId: string, + values: unknown, +) { + 'use server' + const expenseFormValues = expenseFormSchema.parse(values) + await updateExpense(groupId, expenseId, expenseFormValues) + revalidatePath(`/groups/${groupId}`, 'layout') +} + +export async function deleteExpenseAction(groupId: string, expenseId: string) { + 'use server' + await deleteExpense(expenseId) + revalidatePath(`/groups/${groupId}`, 'layout') +} diff --git a/src/app/groups/[groupId]/expenses/create/page.tsx b/src/app/groups/[groupId]/expenses/create/page.tsx deleted file mode 100644 index e603e59..0000000 --- a/src/app/groups/[groupId]/expenses/create/page.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { ExpenseForm } from '@/components/expense-form' -import { createExpense, getGroup } from '@/lib/api' -import { expenseFormSchema } from '@/lib/schemas' -import { Metadata } from 'next' -import { notFound, redirect } from 'next/navigation' - -export const metadata: Metadata = { - title: 'Create expense', -} - -export default async function ExpensePage({ - params: { groupId }, -}: { - params: { groupId: string } -}) { - const group = await getGroup(groupId) - if (!group) notFound() - - async function createExpenseAction(values: unknown) { - 'use server' - const expenseFormValues = expenseFormSchema.parse(values) - await createExpense(expenseFormValues, groupId) - redirect(`/groups/${groupId}`) - } - - return -} diff --git a/src/app/groups/[groupId]/expenses/expense-list.tsx b/src/app/groups/[groupId]/expenses/expense-list.tsx index 798a5f8..adc6e7a 100644 --- a/src/app/groups/[groupId]/expenses/expense-list.tsx +++ b/src/app/groups/[groupId]/expenses/expense-list.tsx @@ -33,7 +33,9 @@ export function ExpenseList({ expense.isReimbursement && 'italic', )} onClick={() => { - router.push(`/groups/${groupId}/expenses/${expense.id}/edit`) + router.push(`/groups/${groupId}/expenses/${expense.id}/edit`, { + scroll: false, + }) }} >
@@ -66,7 +68,10 @@ export function ExpenseList({ {currency} {(expense.amount / 100).toFixed(2)}
diff --git a/src/app/groups/[groupId]/expenses/expense-page.tsx b/src/app/groups/[groupId]/expenses/expense-page.tsx new file mode 100644 index 0000000..281c38b --- /dev/null +++ b/src/app/groups/[groupId]/expenses/expense-page.tsx @@ -0,0 +1,19 @@ +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { ReactNode } from 'react' + +export function ExpensePage({ + children, + title, +}: { + children: ReactNode + title: ReactNode +}) { + return ( + + + {title} + + {children} + + ) +} diff --git a/src/app/groups/[groupId]/expenses/layout.tsx b/src/app/groups/[groupId]/expenses/layout.tsx new file mode 100644 index 0000000..cd65df9 --- /dev/null +++ b/src/app/groups/[groupId]/expenses/layout.tsx @@ -0,0 +1,9 @@ +import { ReactNode } from 'react' + +export default function GroupExpensesLayout({ + children, +}: { + children: ReactNode +}) { + return <>{children} +} diff --git a/src/app/groups/[groupId]/expenses/page.tsx b/src/app/groups/[groupId]/expenses/page.tsx index 5285cb8..64987a3 100644 --- a/src/app/groups/[groupId]/expenses/page.tsx +++ b/src/app/groups/[groupId]/expenses/page.tsx @@ -35,7 +35,7 @@ export default async function GroupExpensesPage({ -- cgit v1.3